有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用有界类型参数的java“两种方法具有相同的擦除”错误

我第一次在Java中使用泛型,我面临着一个无法克服的问题:为什么要编译:

public interface Aa{}
public interface Bb{}
public interface Cc{}


public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}

public static <GenericAB extends Aa & Bb, GenericCA extends Cc & Aa>
void method(GenericAB myAbobject, GenericCA myCAobject){}

但这并不是:

public interface Aa{}
public interface Bb{}
public interface Cc{}


public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}

public static <GenericAB extends Aa & Bb, GenericAC extends Aa & Cc>
void method(GenericAB myAbobject, GenericAC myACobject){}

我得到了这个错误:两种方法都有相同的擦除

如果这是一个愚蠢的问题,我很抱歉,但我不明白为什么有界类型参数声明中的接口顺序似乎具有重要性。 事实上,我不认为是顺序导致了错误,但我不知道是什么导致了错误

我在读this documentation by Oracle,它说我必须把类作为第一个参数,但是Aa、Bb和Cc都是接口。我的英语也很抱歉


共 (2) 个答案

  1. # 2 楼答案

    因为在类型擦除之后的运行时,这两个方法都具有相同的方法头

    public static <GenericAB extends Aa & Bb> void method(GenericAB myABobject1, GenericAB myABobject2){}
    

    变成

    public static void method(Aa myABobject1, Aa myABobject2){}
    

    public static <GenericAB extends Aa & Bb, GenericBC extends Aa & Cc>void method(GenericAB myAbobject, GenericBC myBCobject){}
    

    变成

    public static void method(Aa myAbobject, Aa myBCobject){}
    

    两个结果方法具有相同的签名,这将导致您的错误

    修正以下参数后进行编辑